﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Services;
using MMK.PaketTracker.Server.Definitions;
using MMK.PaketTracker.Server.Application;
using MMK.PaketTracker.Server.Helpers;
using System.Configuration;

namespace MMK.PaketTracker.Server.Web
{
	public class Webservices : System.Web.Services.WebService
	{
		[WebMethod]
		public string Test( string test )
		{
			LogHelper.WriteLog("Aufruf: Test [test:" + test + "]");

			LogHelper.WriteLog("Aufruf: Test [Rueckgabe:success]");
			return "success";
		}

        [WebMethod]
        public string NewPaket(double gewicht, double preis, Adresse absender, Adresse empfaenger)
        {
			LogHelper.WriteLog("Aufruf: NewPaket [gewicht:" + gewicht + ",preis:" + preis +",Absender:" + absender + ",empfaenger:" + empfaenger + "]");

            string paketIdent;

            if (Convert.ToBoolean(ConfigurationManager.AppSettings["GenerateIdent"]) == true)
            {
                paketIdent = PaketManager.CreateNewPaket(absender, empfaenger, gewicht, preis, String.Empty);
            }
            else
            {
                paketIdent = PaketManager.CreateNewPaket(absender, empfaenger, gewicht, preis, ConfigurationManager.AppSettings["PaketIdent"]);
            }

			LogHelper.WriteLog("Aufruf: NewPaket [Rueckgabe:" + paketIdent + "]");

            return paketIdent;
        }

        [WebMethod]
        public void ResetDatabase()
        {
            LogHelper.WriteLog("Aufruf: ResetDatabase");

            ExecuteSqlManager.ExecuteSql("DELETE FROM Adressen");
            ExecuteSqlManager.ExecuteSql("DELETE FROM FahrzeugGPSData");
            ExecuteSqlManager.ExecuteSql("DELETE FROM FahrzeugPaket");
            ExecuteSqlManager.ExecuteSql("DELETE FROM Pakete");
            ExecuteSqlManager.ExecuteSql("DELETE FROM PaketStatus");

            LogHelper.WriteLog("Aufruf: ResetDatabase [Rueckgabe:void]");

        }

        [WebMethod]
        public void InVersandprozessAufgenommen(string paketIdent, Guid mitarbeiterID, Guid stationID, string beschreibung)
        {
			LogHelper.WriteLog("Aufruf: InVersandprozessAufgenommen [paketIdent:" + paketIdent + ",mitarbeiterID:" + mitarbeiterID + ",stationID:" + stationID + ",beschreibung:" + beschreibung + "]");

			PaketManager.CreateNewPaketStatus(paketIdent, PaketStatusType.InVersandprozessAufgenommen, beschreibung, mitarbeiterID, stationID);

			LogHelper.WriteLog("Aufruf: InVersandprozessAufgenommen [Rueckgabe:void]");
        }

        [WebMethod]
        public void ImVersandprozess(string paketIdent, Guid mitarbeiterID, Guid stationID, string beschreibung)
        {
			LogHelper.WriteLog("Aufruf: ImVersandprozess [paketIdent:" + paketIdent + ",mitarbeiterID:" + mitarbeiterID + ",stationID:" + stationID + ",beschreibung:" + beschreibung + "]");

			PaketManager.CreateNewPaketStatus(paketIdent, PaketStatusType.ImVersandprozess, beschreibung, mitarbeiterID, stationID);

			LogHelper.WriteLog("Aufruf: ImVersandprozess [Rueckgabe:void]");
        }

        [WebMethod]
        public void InAuslieferung(string paketIdent, Guid mitarbeiterID, Guid fahrzeugID, string beschreibung)
        {
			LogHelper.WriteLog("Aufruf: InAuslieferung [paketIdent:" + paketIdent + ",mitarbeiterID:" + mitarbeiterID + ",fahrzeugID:" + fahrzeugID + ",beschreibung:" + beschreibung + "]");
			
			FahrzeugManager.CreateFahrzeugPaketRelation(fahrzeugID, paketIdent);

			FahrzeugManager.CreateNewGPSStatus(fahrzeugID, new GPSCoordinate() { Latitude = 52.522645, Longitude = 13.497305 });

            PaketManager.CreateNewPaketStatus(paketIdent, PaketStatusType.InAuslieferung, beschreibung, mitarbeiterID, Guid.Empty);

			LogHelper.WriteLog("Aufruf: InAuslieferung [Rueckgabe:void]");
        }

        [WebMethod]
		public void Ausgeliefert(string paketIdent, Guid mitarbeiterID, Guid fahrzeugID, string beschreibung)
        {
			LogHelper.WriteLog("Aufruf: Ausgeliefert [paketIdent:" + paketIdent + ",mitarbeiterID:" + mitarbeiterID + ",fahrzeugID:" + fahrzeugID + ",beschreibung:" + beschreibung + "]");
			
			FahrzeugManager.CreateNewGPSStatus(fahrzeugID, new GPSCoordinate() { Latitude = 52.522645, Longitude = 13.497305 });
			
			PaketManager.CreateNewPaketStatus(paketIdent, PaketStatusType.Ausgeliefert, beschreibung, mitarbeiterID, Guid.Empty);

			LogHelper.WriteLog("Aufruf: Ausgeliefert [Rueckgabe:void]");
        }
        
        [WebMethod]
        public void GPS(Guid fahrzeugGuid, GPSCoordinate coordinate)
        {
			LogHelper.WriteLog("Aufruf: GPS [fahrzeugGuid:" + fahrzeugGuid + ",coordinate:" + coordinate + "]");
			
			FahrzeugManager.CreateNewGPSStatus(fahrzeugGuid, coordinate);

			LogHelper.WriteLog("Aufruf: GPS [Rueckgabe:void]");
        }

        [WebMethod]
        public PaketStatus GetPaketStatus(string paketIdent)
        {
			LogHelper.WriteLog("Aufruf: GetPaketStatus [paketIdent:" + paketIdent + "]");

			PaketStatus status = PaketManager.GetPaketStatus(paketIdent);

			LogHelper.WriteLog("Aufruf: GetPaketStatus [Rueckgabe:" + status + "]");

            return status;
        }

        [WebMethod]
        public PaketStatus GetPaketStatusWithoutImage(string paketIdent)
        {
            LogHelper.WriteLog("Aufruf: GetPaketStatusWithoutImage [paketIdent:" + paketIdent + "]");

            PaketStatus status = PaketManager.GetPaketStatus(paketIdent);

            if (status != null)
                status.MapImage = null;

            LogHelper.WriteLog("Aufruf: GetPaketStatusWithoutImage [Rueckgabe:" + status + "]");

            return status;
        }

        [WebMethod]
        public string GetPaketStatusString(string paketIdent)
        {
            LogHelper.WriteLog("Aufruf: GetPaketStatusString [paketIdent:" + paketIdent + "]");

            PaketStatus status = PaketManager.GetPaketStatus(paketIdent);
            string result = String.Empty;

            if (status != null)
            {
                result = status.Status.ToString();
                //status.MapImage = null;
            }
            LogHelper.WriteLog("Aufruf: GetPaketStatusString [Rueckgabe:" + result + "]");

            return result;
        }

        [WebMethod]
        public string GetPaketStatusImageUrl(string paketIdent)
        {
            LogHelper.WriteLog("Aufruf: GetPaketStatusImageUrl [paketIdent:" + paketIdent + "]");

            PaketStatus status = PaketManager.GetPaketStatus(paketIdent);
            string result = String.Empty;

            if (status != null)
            {
                result = status.MapImageUrl;
                //status.MapImage = null;
            }
            LogHelper.WriteLog("Aufruf: GetPaketStatusImageUrl [Rueckgabe:" + result + "]");

            return result;
        }

        [WebMethod]
        public List<PaketStatus> GetAllPaketStatus(string paketIdent)
        {
            LogHelper.WriteLog("Aufruf: GetAllPaketStatus [paketIdent:" + paketIdent + "]");

            List<PaketStatus> list = PaketManager.GetAllPaketStatus(paketIdent);

            LogHelper.WriteLog("Aufruf: GetAllPaketStatus [Rueckgabe:" + list + "]");

            return list;
        }

		[WebMethod]
		public Adresse GetAdresse(string paketIdent, AdresseType type)
		{
			LogHelper.WriteLog("Aufruf: GetAdresse [paketIdent:" + paketIdent + ",type:" + type + "]");

			Adresse adresse = PaketManager.GetAdresse(paketIdent, type);

			LogHelper.WriteLog("Aufruf: GetAdresse [Rueckgabe:" + adresse + "]");

			return adresse;
		}

		[WebMethod]
		public Mitarbeiter IsMitarbeiterValid(string barcode)
		{
			LogHelper.WriteLog("Aufruf: IsMitarbeiterValid [barcode:" + barcode + "]");

			List<Mitarbeiter> mitarbeiter = MitarbeiterManager.GetMitarbeiter();

			foreach (Mitarbeiter mit in mitarbeiter)
			{
				if (mit.Barcode.ToLower() == barcode.ToLower())
				{
					LogHelper.WriteLog("Aufruf: IsMitarbeiterValid [Rueckgabe:true]");
					return mit;
				}
			}

			LogHelper.WriteLog("Aufruf: IsMitarbeiterValid [Rueckgabe:false]");
			return null;
		}

        [WebMethod]
        public Mitarbeiter GetMitarbeiter(Guid mitarbeiterGuid)
        {
            LogHelper.WriteLog("Aufruf: GetMitarbeiter [barcode:" + mitarbeiterGuid + "]");

            List<Mitarbeiter> mitarbeiter = MitarbeiterManager.GetMitarbeiter();

            foreach (Mitarbeiter mit in mitarbeiter)
            {
                if (mit.Guid == mit.Guid)
                {
                    LogHelper.WriteLog("Aufruf: GetMitarbeiter [Rueckgabe:true]");
                    return mit;
                }
            }

            LogHelper.WriteLog("Aufruf: GetMitarbeiter [Rueckgabe:false]");
            return null;
        }
	}
}
